#include <REGX52.H>

sbit OneWire_DQ=P3^7;

unsigned char OneWire_Init()	//初始化
{
	unsigned char AckBit;
	unsigned char i;
	OneWire_DQ=1;
	OneWire_DQ=0;
	i = 220;while (--i);	//延时480us，由于函数体执行花4us，故延时484us
	OneWire_DQ=1;
	i = 31;while (--i);		//延时70us
	AckBit=OneWire_DQ;		//如果总线被拉低有从机响应
	i = 220;while (--i);	//延时480us将流程执行完
	return AckBit;
}

void OneWire_SendBit(unsigned char Bit)	//发送一位
{
	unsigned char i;
	OneWire_DQ=0;
	i = 3;while (--i);	//延时10us，由于函数体执行花4us，故延时14us
	OneWire_DQ=Bit;		//如果此时已释放总线，表示发送0，否则发送1
	i = 22;while (--i);		//延时50us
	OneWire_DQ=1;		//如果总线被拉低有从机响应
}

unsigned char OneWire_ReceiveBit(void)	//接受一位
{
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ=0;				//主机拉低
	i = 2;while (--i);			//Delay 5us
	OneWire_DQ=1;				//主机拉高
	i = 2;while (--i);			//Delay 5us
	Bit=OneWire_DQ;				//若从机拉低此时OneWire_DQ=0，若从机没拉低此时OneWire_DQ=1
	i = 24;while (--i);			//Delay 50us
	return Bit;
}

/**
  * @brief  单总线发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));//先发低位，故从低位向左移
	}
}

/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
	}
	return Byte;
}